﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

namespace Microsoft.DotNet.Cli.Telemetry.PersistenceChannel;

internal class SnapshottingDictionary<TKey, TValue> :
    SnapshottingCollection<KeyValuePair<TKey, TValue>, IDictionary<TKey, TValue>>, IDictionary<TKey, TValue>
{
    public SnapshottingDictionary()
        : base(new Dictionary<TKey, TValue>())
    {
    }

    public ICollection<TKey> Keys => GetSnapshot().Keys;

    public ICollection<TValue> Values => GetSnapshot().Values;

    public TValue this[TKey key]
    {
        get => GetSnapshot()[key];

        set
        {
            lock (Collection)
            {
                Collection[key] = value;
                snapshot = null;
            }
        }
    }

    public void Add(TKey key, TValue value)
    {
        lock (Collection)
        {
            Collection.Add(key, value);
            snapshot = null;
        }
    }

    public bool ContainsKey(TKey key)
    {
        return GetSnapshot().ContainsKey(key);
    }

    public bool Remove(TKey key)
    {
        lock (Collection)
        {
            bool removed = Collection.Remove(key);
            if (removed)
            {
                snapshot = null;
            }

            return removed;
        }
    }

    public bool TryGetValue(TKey key, out TValue value)
    {
        return GetSnapshot().TryGetValue(key, out value);
    }

    protected sealed override IDictionary<TKey, TValue> CreateSnapshot(IDictionary<TKey, TValue> collection)
    {
        return new Dictionary<TKey, TValue>(collection);
    }
}
